import os
import subprocess
import platform
import sys
import time
import requests


def validate_project_structure():
    """
    校验项目目录结构：确保 frontend_new 与 backend 同级（当前脚本在 frontend_new 下）
    返回：(是否合法, backend绝对路径, 错误信息)
    """
    # 1. 获取当前脚本所在目录（frontend_new）的绝对路径
    current_script_path = os.path.abspath(__file__)
    frontend_new_dir = os.path.dirname(current_script_path)
    print(f"[目录校验] 当前脚本所在目录（frontend_new）：{frontend_new_dir}")

    # 2. 推导项目根目录（frontend_new 的上级目录）
    project_root = os.path.dirname(frontend_new_dir)
    print(f"[目录校验] 推导的项目根目录：{project_root}")

    # 3. 拼接 backend 目录路径并校验
    backend_dir = os.path.join(project_root, "backend")
    if os.path.exists(backend_dir) and os.path.isdir(backend_dir):
        print(f"[目录校验] ✅ backend 目录存在：{backend_dir}")
        return True, backend_dir, None
    else:
        error_msg = (
            f"[目录校验] ❌ backend 目录不存在！\n"
            f"          期望路径：{backend_dir}\n"
            f"          请确认项目结构是否正确（要求 frontend_new 与 backend 同级）"
        )
        return False, backend_dir, error_msg


def check_backend_health():
    """检查后端服务是否健康，对应命令：curl http://localhost:8001/health"""
    try:
        response = requests.get("http://localhost:8001/health", timeout=5)
        if response.status_code == 200:
            print("[健康检查] ✅ 后端服务已启动并正常运行")
            return True
        else:
            print(f"[健康检查] ❌ 后端服务返回非200状态码: {response.status_code}")
            return False
    except requests.exceptions.RequestException as e:
        print(f"[健康检查] ❌ 无法连接到后端服务: {str(e)}")
        return False


def create_chat_session():
    """创建新的聊天会话ID，对应命令：curl -X POST http://localhost:8001/api/chat/session/new ..."""
    try:
        response = requests.post(
            "http://localhost:8001/api/chat/session/new",
            headers={"Content-Type": "application/json"},
            json={"system_context": None},
            timeout=10
        )

        if response.status_code == 200:
            session_data = response.json()
            session_id = session_data.get("session_id")
            if session_id:
                print(f"[会话创建] ✅ 成功创建会话，ID: {session_id}")
                return session_id
            else:
                print("[会话创建] ❌ 响应中未包含会话ID")
                return None
        else:
            print(f"[会话创建] ❌ 创建会话失败，状态码: {response.status_code}")
            print(f"[会话创建] 响应内容: {response.text}")
            return None
    except requests.exceptions.RequestException as e:
        print(f"[会话创建] ❌ 创建会话时发生错误: {str(e)}")
        return None


def start_backend():
    """
    切换到 backend 目录，执行后端启动命令：
    uvicorn app.main:app --host 0.0.0.0 --port 8001 --reload
    """
    # 1. 先校验目录结构
    is_valid, backend_dir, dir_error = validate_project_structure()
    if not is_valid:
        print(dir_error)
        sys.exit(1)  # 目录不合法，退出程序

    # 2. 定义后端启动命令
    backend_cmd = "uvicorn app.main:app --host 0.0.0.0 --port 8001 --reload"
    print(f"\n[后端启动] 🚀 即将执行的后端启动命令：\n          {backend_cmd}")
    print(f"[后端启动] 📍 执行目录：{backend_dir}")

    # 3. 在子进程中启动后端，以便主进程可以执行后续操作
    try:
        if platform.system() == "Windows":
            full_cmd = f"cd /d {backend_dir} && {backend_cmd}"
            print(f"\n[后端启动] 📌 Windows 系统执行命令：\n          {full_cmd}")
            backend_process = subprocess.Popen(full_cmd, shell=True)
        else:
            full_cmd = f"cd {backend_dir} && {backend_cmd}"
            print(f"\n[后端启动] 📌 Linux/macOS 系统执行命令：\n          {full_cmd}")
            backend_process = subprocess.Popen(full_cmd, shell=True, executable="/bin/bash")

        # 等待后端启动
        print("\n[后端启动] 等待服务启动...（约5秒）")
        time.sleep(5)

        # 检查健康状态
        if check_backend_health():
            # 自动创建会话
            print("\n[会话创建] 开始创建新的聊天会话...")
            create_chat_session()

        # 保持后端进程运行
        try:
            backend_process.wait()
        except KeyboardInterrupt:
            print("\n[后端启动] 用户中断，正在停止服务...")
            backend_process.terminate()
            sys.exit(0)

    except Exception as e:
        print(f"\n[后端启动] ❌ 发生错误：{str(e)}")
        sys.exit(1)


def main():
    """程序入口：直接启动后端服务并执行后续检查"""
    print("=" * 60)
    print("🏠 后端服务启动工具（frontend_new 目录下）")
    print("=" * 60)
    print("功能说明：")
    print("1. 自动校验项目目录结构（确保 frontend_new 与 backend 同级）")
    print("2. 自动启动后端服务")
    print("3. 启动命令：uvicorn app.main:app --host 0.0.0.0 --port 8001 --reload")
    print("4. 自动验证健康状态并创建会话ID")
    print("=" * 60 + "\n")

    # 直接启动后端，不询问用户
    print("[后端启动] 开始启动后端服务...\n")
    start_backend()


if __name__ == "__main__":
    main()
